@@ -76,17 +76,19 @@ class ScenarioImport |
||
| 76 | 76 |
agent.schedule = agent_diff.schedule.updated if agent_diff.schedule.present? |
| 77 | 77 |
agent.keep_events_for = agent_diff.keep_events_for.updated if agent_diff.keep_events_for.present? |
| 78 | 78 |
agent.propagate_immediately = agent_diff.propagate_immediately.updated if agent_diff.propagate_immediately.present? # == "true" |
| 79 |
+ agent.service_id = agent_diff.service_id.updated if agent_diff.service_id.present? |
|
| 79 | 80 |
unless agent.save |
| 80 | 81 |
success = false |
| 81 | 82 |
errors.add(:base, "Errors when saving '#{agent_diff.name.incoming}': #{agent.errors.full_messages.to_sentence}")
|
| 82 | 83 |
end |
| 83 | 84 |
agent |
| 84 | 85 |
end |
| 85 |
- |
|
| 86 |
- links.each do |link| |
|
| 87 |
- receiver = created_agents[link['receiver']] |
|
| 88 |
- source = created_agents[link['source']] |
|
| 89 |
- receiver.sources << source unless receiver.sources.include?(source) |
|
| 86 |
+ if success |
|
| 87 |
+ links.each do |link| |
|
| 88 |
+ receiver = created_agents[link['receiver']] |
|
| 89 |
+ source = created_agents[link['source']] |
|
| 90 |
+ receiver.sources << source unless receiver.sources.include?(source) |
|
| 91 |
+ end |
|
| 90 | 92 |
end |
| 91 | 93 |
end |
| 92 | 94 |
|
@@ -149,6 +151,9 @@ class ScenarioImport |
||
| 149 | 151 |
errors.add(:base, "Your updated options for '#{agent_data['name']}' were unparsable.")
|
| 150 | 152 |
end |
| 151 | 153 |
end |
| 154 |
+ if agent_diff.requires_service? && merges.present? && merges[index.to_s].present? && merges[index.to_s]['service_id'].present? |
|
| 155 |
+ agent_diff.service_id = AgentDiff::FieldDiff.new(merges[index.to_s]['service_id'].to_i) |
|
| 156 |
+ end |
|
| 152 | 157 |
agent_diff |
| 153 | 158 |
end |
| 154 | 159 |
end |
@@ -192,6 +197,10 @@ class ScenarioImport |
||
| 192 | 197 |
@requires_merge |
| 193 | 198 |
end |
| 194 | 199 |
|
| 200 |
+ def requires_service? |
|
| 201 |
+ !!agent_instance.try(:oauthable?) |
|
| 202 |
+ end |
|
| 203 |
+ |
|
| 195 | 204 |
def store!(agent_data) |
| 196 | 205 |
self.type = FieldDiff.new(agent_data["type"].split("::").pop)
|
| 197 | 206 |
self.options = FieldDiff.new(agent_data['options'] || {})
|
@@ -252,5 +261,9 @@ class ScenarioImport |
||
| 252 | 261 |
key.gsub(/[^a-zA-Z0-9_-]/, '') |
| 253 | 262 |
end |
| 254 | 263 |
end |
| 264 |
+ |
|
| 265 |
+ def agent_instance |
|
| 266 |
+ "Agents::#{self.type.updated}".constantize.new
|
|
| 267 |
+ end |
|
| 255 | 268 |
end |
| 256 | 269 |
end |
@@ -120,6 +120,16 @@ |
||
| 120 | 120 |
</div> |
| 121 | 121 |
<% end %> |
| 122 | 122 |
</div> |
| 123 |
+ <% if agent_diff.requires_service? %> |
|
| 124 |
+ <div class='row'> |
|
| 125 |
+ <div class='col-md-4'> |
|
| 126 |
+ <div class="form-group type-select"> |
|
| 127 |
+ <%= label_tag "scenario_import[merges][#{index}][service_id]", 'Service' %>
|
|
| 128 |
+ <%= select_tag "scenario_import[merges][#{index}][service_id]", options_for_select(agent_diff.agent_instance.valid_services(current_user).collect { |s| ["(#{s.provider}) #{s.name}", s.id]}, agent_diff.service_id.try(:current)), class: 'form-control' %>
|
|
| 129 |
+ </div> |
|
| 130 |
+ </div> |
|
| 131 |
+ </div> |
|
| 132 |
+ <% end %> |
|
| 123 | 133 |
</div> |
| 124 | 134 |
<% end %> |
| 125 | 135 |
</div> |
@@ -11,7 +11,7 @@ |
||
| 11 | 11 |
# |
| 12 | 12 |
# It's strongly recommended that you check this file into your version control system. |
| 13 | 13 |
|
| 14 |
-ActiveRecord::Schema.define(version: 20140605032822) do |
|
| 14 |
+ActiveRecord::Schema.define(version: 20140723110551) do |
|
| 15 | 15 |
|
| 16 | 16 |
# These are extensions that must be enabled in order to support this database |
| 17 | 17 |
enable_extension "plpgsql" |
@@ -45,6 +45,18 @@ describe ScenarioImport do |
||
| 45 | 45 |
:options => trigger_agent_options |
| 46 | 46 |
} |
| 47 | 47 |
end |
| 48 |
+ let(:valid_parsed_basecamp_agent_data) do |
|
| 49 |
+ {
|
|
| 50 |
+ :type => "Agents::BasecampAgent", |
|
| 51 |
+ :name => "Basecamp test", |
|
| 52 |
+ :schedule => "every_2m", |
|
| 53 |
+ :keep_events_for => 0, |
|
| 54 |
+ :propagate_immediately => true, |
|
| 55 |
+ :disabled => false, |
|
| 56 |
+ :guid => "a-basecamp-agent", |
|
| 57 |
+ :options => {project_id: 12345}
|
|
| 58 |
+ } |
|
| 59 |
+ end |
|
| 48 | 60 |
let(:valid_parsed_data) do |
| 49 | 61 |
{
|
| 50 | 62 |
:name => name, |
@@ -407,5 +419,48 @@ describe ScenarioImport do |
||
| 407 | 419 |
end |
| 408 | 420 |
end |
| 409 | 421 |
end |
| 422 |
+ |
|
| 423 |
+ context "agents which require a service" do |
|
| 424 |
+ let(:valid_parsed_services) do |
|
| 425 |
+ data = valid_parsed_data |
|
| 426 |
+ data[:agents] = [valid_parsed_basecamp_agent_data, |
|
| 427 |
+ valid_parsed_trigger_agent_data] |
|
| 428 |
+ data |
|
| 429 |
+ end |
|
| 430 |
+ |
|
| 431 |
+ let(:valid_parsed_services_data) { valid_parsed_services.to_json }
|
|
| 432 |
+ |
|
| 433 |
+ let(:services_scenario_import) {
|
|
| 434 |
+ _import = ScenarioImport.new(:data => valid_parsed_services_data) |
|
| 435 |
+ _import.set_user users(:bob) |
|
| 436 |
+ _import |
|
| 437 |
+ } |
|
| 438 |
+ |
|
| 439 |
+ describe "#generate_diff" do |
|
| 440 |
+ it "should check if the agent requires a service" do |
|
| 441 |
+ agent_diffs = services_scenario_import.agent_diffs |
|
| 442 |
+ basecamp_agent_diff = agent_diffs[0] |
|
| 443 |
+ basecamp_agent_diff.requires_service?.should == true |
|
| 444 |
+ end |
|
| 445 |
+ |
|
| 446 |
+ it "should add an error when no service is selected" do |
|
| 447 |
+ services_scenario_import.import.should == false |
|
| 448 |
+ services_scenario_import.errors[:base].length.should == 1 |
|
| 449 |
+ end |
|
| 450 |
+ end |
|
| 451 |
+ |
|
| 452 |
+ describe "#import" do |
|
| 453 |
+ it "should import" do |
|
| 454 |
+ services_scenario_import.merges = {
|
|
| 455 |
+ "0" => {
|
|
| 456 |
+ "service_id" => "0", |
|
| 457 |
+ } |
|
| 458 |
+ } |
|
| 459 |
+ lambda {
|
|
| 460 |
+ services_scenario_import.import.should == true |
|
| 461 |
+ }.should change { users(:bob).agents.count }.by(2)
|
|
| 462 |
+ end |
|
| 463 |
+ end |
|
| 464 |
+ end |
|
| 410 | 465 |
end |
| 411 | 466 |
end |